import javax.swing.*;

public class Student {
    //若类中的属性没有初始 其属性依旧可以访问 但值是与之对应的 "0值"
    // 整数类型都是0 浮点型都是0.0 引用是null boolean是false

    //给静态成员变量赋值有三种方法：
    private String name;
    //1. 就地赋值
    private static String grade = "计算机";

    private static int cnt=100;

    private Student() {
        System.out.println("调用无参构造");
    }

    //2. 静态成员方法
    public static void setGrade(String grade) {
        Student.grade = grade;
    }

    //3. 静态代码块 在类加载时运行
    static {
        System.out.println("调用静态代码块");
        Student.grade = "计算机122";
    }

    //实例代码块 一般用于给非静态成员赋值
    {
        System.out.println("调用实例代码块");
        this.name = "无名请赋值";
    }

    private Student(String name) {
        this.name = name;
    }

    public void show() {
        System.out.println(this.name + "->" + Student.grade);
    }

    public static void printCnt(){
        System.out.println("cnt="+cnt);
    }

    public static void main(String[] args) {
        //static成员 (在第一次初始化完成后将不再进行初始化了)
        Student s1=new Student();
        s1.cnt++;
        Student s2=new Student();
        s2.cnt++;
        s1=new Student();
        s1.cnt++;
        Student.cnt--;
        System.out.println("cnt="+cnt);

        System.out.println("___________________________");
        /*
         * 调用静态代码块
         * 调用实例代码块
         * 调用无参构造
         * 调用实例代码块
         * 调用无参构造
         * 调用实例代码块
         * 调用无参构造
         * cnt=102
         * ___________________________
         */

        //在一个类的main方法中 可直接通过对应的方法名调用对应的static修饰的方法
        printCnt();//cnt=102

        //static 修饰一个类的成员变量后变成 静态成员变量(类变量) 存储在方法区 属于类 不属于任何一个对象(也不依赖任何一个对象)
        //static 修饰一个类的成员方法后变成 静态成员方法
        //static 修饰的属性和方法都可以通过对象和类名访问 但更应该用类名访问
        //静态成员方法中只能访问静态成员变量和静态成员方法
        //static 不能用于修饰类的方法中的变量

        //static int sint=10;//报错 static 不能用于修饰类的方法中的变量

        Student stu1 = new Student();
        stu1.show();
        /*
         * 调用实例代码块
         * 调用无参构造
         * 无名请赋值->计算机122
         */

        System.out.println("____________________");

        Student stu2 = new Student();
        stu1.show();
        /*
         * 调用实例代码块
         * 调用无参构造
         * 无名请赋值->计算机122
         */

        //可用静态代码块给类变量初始化
        //可用实例代码块给非静态成员变量初始化

        //静态代码块 只在加载对象时运行一次
        //构造代码块 会在每次构造对象时运行

        //普通代码块
        {
            System.out.println("这是一个普通代码块");//这是一个普通代码块
        }

        //执行顺序是(先后)： 静态的 实例的 构造函数

    }
}
